#include <stdio.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>

#ifndef CVGAUSSIAN_H
#define CVGAUSSIAN_H

/**
@class CVGaussian
@brief Création de gaussiennes et dérivées de gaussiennes
*/
class CVGaussian 
{
  public:
  	CVGaussian();
  	CVGaussian(float sigma_s,float sigma_t,int dim_t,int dim_x,int dim_y);
  	~CVGaussian();
  	
  	//fonctions de recuperation des parametres

  	float getSigma_S();
  	float getSigma_T();
  	int getDimT();
  	int getDimX();
  	int getDimY();
		int getDimTs2();
  	int getDimXs2();
  	int getDimYs2();
  	
		cv::Mat_<float> & get_G();
  	cv::Mat_<float> & get_dGdx();
  	cv::Mat_<float> & get_dGdy();
  	cv::Mat_<float> & get_dGdxdy();
  	cv::Mat_<float> & get_dGdx2();
  	cv::Mat_<float> & get_dGdy2();
  	cv::Mat_<float> & get_dGdt();
  	cv::Mat_<float> & get_dGdt2();
  		

  	//fonctions de modification des parametres
		void init(float sigma_s,float sigma_t,int dim_t,int dim_x,int dim_y);
  	void setSigma_S(float sigma_s);
  	void setSigma_T(float sigma_t);
  	void setDimT(int dim_t);
  	void setDimX(int dim_x);
  	void setDimY(int dim_y);
  	
  	//fonction d'affichage pour le debugage
		void stdprintf();

  private:
  
  	float sigma_s;//spatial
  	float sigma_t;//temporel
  	int dim_t,dim_x,dim_y;//dimention temporel spatialX et spatialY
		int dim_ts2,dim_xs2,dim_ys2;//dimention/2 temporel spatialX et spatialY  	

  	//fontions pour précalcul des filtres 
  	void calculMatrices(); //recrée l'ensemble des matrices
		void calcul_G();
  	void calcul_dGdx();
  	void calcul_dGdy();
  	void calcul_dGdxdy();
  	void calcul_dGdx2();
  	void calcul_dGdy2();
  	void calcul_dGdt();
  	void calcul_dGdt2();
  	
  	//filtres
		cv::Mat_<float> G;
  	cv::Mat_<float> dGdx;
  	cv::Mat_<float> dGdy;
  	cv::Mat_<float> dGdxdy;
  	cv::Mat_<float> dGdx2;
  	cv::Mat_<float> dGdy2;
  	cv::Mat_<float> dGdt;
  	cv::Mat_<float> dGdt2;
};


#endif
